import axios from 'axios'
// import qs from 'qs'
// import { Spin } from 'ant-design-vue'

import router from '../router'
import store from '../store'
import { localStorageRemove, error } from '../utils/function'
import { BASE_URL } from '../config/config'
/**
 * 跳转到登录页面
 */
const toLogin = () => {
  router.replace({
    path: "/login",
    query: {
      redirect: router.currentRoute.fullPath
    }
  })
}

/**
* 跳转到404
*/
const to404 = () => {
  router.push({
    path: "/404"
  })
}

/**
 * 请求失败后的错误统一处理
*/
const errorHandle = (status, other) => {
  // 状态码判断
  switch (status) {
    case 400:
      error("错误请求")
      break
    // 401: 未登录状态，跳转登录页
    case 401:
      error("账号或密码错误")
      break
    // 403 token过期
    // 清除token并跳转登录页
    case 403:
      error("登录过期，请重新登录")
      localStorageRemove("sea_amoy_admin_token")
      store.commit("login", null)
      setTimeout(() => {
        toLogin()
      }, 1000)
      break
    // 404请求不存在
    case 404:
      error("请求的资源不存在")
      to404()
      break
    case 405:
      error('请求方法未允许')
      break
    case 408:
      error('请求超时')
      break
    case 500:
      error('服务器端出错')
      break
    case 501:
      error('网络未实现')
      break
    case 502:
      error('网络错误')
      break
    case 503:
      error('服务不可用')
      break
    case 504:
      error('网络超时')
      break
    case 505:
      error('http版本不支持该请求')
      break
    default:
      console.log("other", other)
  }
}

const http = axios.create({
  timeout: 10000,
  baseURL: BASE_URL
})

//设置请求头
http.defaults.headers.post["content-type"] = "application/x-www-form-urlencoded"

//请求拦截器
http.interceptors.request.use(
  config => {
    // Spin.setDefaultIndicator({
    //   tip: '加载中...',
    //   spinning: true
    // })
    const { sea_amoy_admin_token } = store.state
    sea_amoy_admin_token && (config.headers.Authorization = sea_amoy_admin_token)
    return config
  },
  error => {
    console.log(error)
    return Promise.reject(error)
  }
)

//响应拦截器
http.interceptors.response.use(
  res => {
    // Spin.setDefaultIndicator({
    //   tip: '加载中...',
    //   spinning: false
    // })
    if (res.status == 200) {
      const { status_code, message } = res.data
      switch (status_code) {
        case 200:
          return Promise.resolve(res)
        case 400:
          return error(message)
        case 401:
          error("登录过期，请重新登录")
          store.commit("logout")
          setTimeout(() => {
            toLogin()
          }, 500)
          break
        case 402:
          error("登录过期，请重新登录")
          store.commit("logout")
          setTimeout(() => {
            toLogin()
          }, 500)
          break
        case 404:
          to404()
          break
        case 433:
          return error(message)
        default:
          break
      }
    } else {
      return Promise.reject(res)
    }
  },
  err => {
    // Spin.setDefaultIndicator({
    //   tip: '加载中...',
    //   spinning: false
    // })
    const { response } = err
    console.log('err', err)
    if (response) {
      //请求已发出，但是不在2xx的范围
      errorHandle(response.status, response.data.message)
      return Promise.reject(response)
    } else {
      // 处理断网的情况
      // eg:请求超时或断网时，更新state的network状态
      // network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
      // 关于断网组件中的刷新重新获取数据，会在断网组件中说明
      //   store.commit("changeNetwork", false);
    }
  }
)

export function get(url, params) {
  return new Promise((resolve, reject) => {
    http.get(url, { params }).then(res => {
      resolve(res.data)
    }).catch(err => {
      reject(err)
    })
  })
}

export function post(url, params) {
  return new Promise((resolve, reject) => {
    // http.post(url, qs.stringify(params)).then(res => {
    http.post(url, params).then(res => {
      resolve(res.data)
    }).catch(err => {
      reject(err)
    })
  })
}
